package org.activiti.designer.eclipse.navigator;
import java.util.HashMap;
import java.util.Map;
import org.activiti.designer.eclipse.common.ActivitiBPMNDiagramConstants;
import org.activiti.designer.eclipse.common.ActivitiProjectNature;
import org.activiti.designer.eclipse.navigator.nodes.BpmnElementsNode;
import org.activiti.designer.eclipse.navigator.nodes.base.IContainerNode;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.IResourceChangeEvent;
import org.eclipse.core.resources.IResourceChangeListener;
import org.eclipse.core.resources.IResourceDelta;
import org.eclipse.core.resources.IResourceDeltaVisitor;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.jface.viewers.ITreeContentProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.Viewer;
import org.eclipse.ui.progress.UIJob;
public class BpmnTreeContentProvider implements ITreeContentProvider, IResourceChangeListener {
private Viewer viewer;
private Map<IProject, BpmnElementsNode> projectToBpmn2ElementsNode = new HashMap<IProject, BpmnElementsNode>();
public BpmnTreeContentProvider() {
super();
ResourcesPlugin.getWorkspace().addResourceChangeListener(this, IResourceChangeEvent.POST_CHANGE);
}
@Override
public Object[] getChildren(Object parentElement) {
if (parentElement instanceof IContainerNode) {
IContainerNode icn = (IContainerNode) parentElement;
return icn.getChildren();
}
if (parentElement instanceof IProject) {
IProject project = (IProject) parentElement;
try {
if (project.isAccessible() && project.hasNature(ActivitiProjectNature.NATURE_ID)) {
BpmnElementsNode bpmn2Node = projectToBpmn2ElementsNode.get(project);
if (bpmn2Node == null) {
bpmn2Node = new BpmnElementsNode(project, project, viewer);
projectToBpmn2ElementsNode.put(project, bpmn2Node);
}
return new Object[] { bpmn2Node };
}
} catch (CoreException e) {
// Ignore. E.g., project was deleted.
}
}
if (parentElement instanceof EObject) {
EObject eObject = (EObject) parentElement;
return eObject.eContents().toArray();
}
return new Object[0];
}
@Override
public Object getParent(Object element) {
return null;
}
@Override
public boolean hasChildren(Object element) {
if (element instanceof IContainerNode) {
IContainerNode icn = (IContainerNode) element;
return icn.hasChildren();
}
if (element instanceof EObject) {
return !((EObject) element).eContents().isEmpty();
}
return true;
}
@Override
public Object[] getElements(Object inputElement) {
return null;
}
@Override
public void dispose() {
// do nothing
}
@Override
public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
this.viewer = viewer;
}
@Override
public void resourceChanged(IResourceChangeEvent event) {
IResourceDelta delta = event.getDelta();
try {
delta.accept(new IResourceDeltaVisitor() {
@Override
public boolean visit(IResourceDelta delta) throws CoreException {
IResource resource = delta.getResource();
if (resource == null)
return false;
switch (resource.getType()) {
case IResource.ROOT:
return true;
case IResource.PROJECT:
IProject p = (IProject) resource;
try {
boolean hasNature = p.hasNature(ActivitiProjectNature.NATURE_ID);
return hasNature;
} catch (CoreException e) {
// Do nothing, e.g. project deleted.
}
return false;
case IResource.FOLDER:
return true;
case IResource.FILE:
final IFile file = (IFile) resource;
if (file.getName().endsWith(ActivitiBPMNDiagramConstants.DIAGRAM_EXTENSION) || file.getName().equals("Predefined.data")) { //$NON-NLS-1$
UIJob job = new UIJob("Update Viewer") { //$NON-NLS-1$
@Override
public IStatus runInUIThread(IProgressMonitor monitor) {
if (viewer != null && !viewer.getControl().isDisposed()) {
BpmnElementsNode bpmnNode = projectToBpmn2ElementsNode.get(file.getProject());
if (viewer instanceof StructuredViewer && bpmnNode != null) {
((StructuredViewer) viewer).refresh(bpmnNode, true);
} else {
viewer.refresh();
}
}
return Status.OK_STATUS;
}
};
job.setSystem(true);
job.schedule();
}
return false;
}
return false;
}
});
} catch (CoreException e1) {
return;
}
}
}